package cn.xianshu.service.impl;

import cn.xianshu.constants.BaseConstants;
import cn.xianshu.constants.ErrorCode;
import cn.xianshu.domain.Employee;
import cn.xianshu.domain.Login;
import cn.xianshu.domain.Tenant;
import cn.xianshu.dto.LoginAndMealDto;
import cn.xianshu.dto.TenantRegisterDto;
import cn.xianshu.feign.client.LoginFeignClient;
import cn.xianshu.mapper.TenantMapper;
import cn.xianshu.service.IEmployeeService;
import cn.xianshu.service.ITenantService;
import cn.xianshu.util.AjaxResult;
import cn.xianshu.util.AssertUtil;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Uncle Xian
 * @since 2021-11-21
 */
@Service
public class TenantServiceImpl extends ServiceImpl<TenantMapper, Tenant> implements ITenantService {

    @Autowired
    private LoginFeignClient loginFeignClirnt;

    @Autowired
    private IEmployeeService employeeService;

    /**
     * 机构入驻
     * 1.参数校验(基本校验，重复校验)
     * 2.保存login表，密码加密加盐
     * 3.保存机构和套餐关系表 login和套餐中间表；
     * 4.保存管理员 （employee），employee关联login的id
     * 5.保存机构表 机构关联管理员id
     *
     * @param dto ： 对象
     */
    @Transactional(rollbackFor = {Exception.class})
    @Override
    public void entering(TenantRegisterDto dto) {



        //1.参数校验(基本校验，重复校验)
        Login login = dto.getLogin();
        Tenant tenant = dto.getTenant();
        Employee employee = dto.getEmployee();
        Long mealId = dto.getMealId();

        if (StringUtils.isEmpty(login.getUsername()) || StringUtils.isEmpty(login.getPassword())) {
            throw new RuntimeException("账户密码不能为空!");
        }
        // 判断用户是否存在 TODO

        // 判断入驻信息是否为空
        AssertUtil.isNotEmpty(login.getUsername(), ErrorCode.LOGIN_USERNAME_IS_NULL.getFullMessage());
        AssertUtil.isNotEmpty(login.getPassword(), ErrorCode.LOGIN_PASSWORD_IS_NULL.getFullMessage());
        AssertUtil.isNotEmpty(tenant.getCompanyName(), ErrorCode.TENANT_NAME_IS_NULL.getFullMessage());

        //2.保存login表，密码加密加盐 TODO 加密

        //3.保存机构和套餐关系表 login和套餐中间表；
        LoginAndMealDto loginAndMealDto = new LoginAndMealDto();
        // 后台用户类型
        login.setType(BaseConstants.login.TYPE_SYSTEM);
        // 登录信息
        loginAndMealDto.setLogin(login);
        // 套餐id
        loginAndMealDto.setMealId(mealId);
        // TODO 需要保存机构名和机构ID到login
        AjaxResult ajaxResult = loginFeignClirnt.saveLoginAndMeal(loginAndMealDto);
        if (!ajaxResult.isSuccess() || ajaxResult == null){
            throw new RuntimeException("登录用户保存失败!");
        }

        // 登录用户Id
        Long loginId = Long.valueOf(ajaxResult.getResultObj().toString());
        //4.保存管理员 （employee），employee关联login的id
        Employee employee1 = new Employee();
        // 邮箱
        employee1.setEmail(employee.getEmail());
        // 电话
        employee1.setTel(employee.getTel());
        // 登陆表Id
        employee1.setLoginId(loginId);

        // 注册时间
        Date date = new Date();
        employee1.setInputTime(date);
        // 机构管理员
        employee1.setType(BaseConstants.employuee.TYPE_TENANT_ADMIN);
        employeeService.insert(employee1);

        //5.保存机构表 机构关联管理员id
        tenant.setRegisterTime(date);
        // 0 待审核
        tenant.setState(BaseConstants.Tenant.STATE_WAIT_AUDIT);
        tenant.setAdminId(employee1.getId());
        insert(tenant);
        // 添加机构表 id
        System.out.println(tenant.getId());

        employee1.setTenantId(tenant.getId());
        employeeService.updateById(employee1);

    }
}